home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2010 April
/
PCWorld0410.iso
/
redakcyjne
/
programy
/
Weather Watcher Live 6.1.23
/
WWL6123.exe
/
{app}
/
Skins
/
Interface
/
Splendid2
/
Includes
/
NiceTitle.js
< prev
next >
Wrap
Text File
|
2009-09-30
|
10KB
|
307 lines
var supressNiceTitles = false;
function NiceTitles(sTemplate, nDelay, nStringMaxLength, nMarginX, nMarginY, sContainerID, sClassName){
var oTimer;
var isActive = false;
var showingAlready = false; //added var to start cursor tracking only AFTER delay occurs in show();
var sNameSpaceURI = "http://www.w3.org/1999/xhtml";
if(!sTemplate){ sTemplate = "attr(nicetitle)";}
if(!nDelay || nDelay <= 0){ nDelay = false;}
if(!nStringMaxLength){ nStringMaxLength = 999999999; }
if(!nMarginX){ nMarginX = 15; }
if(!nMarginY){ nMarginY = 0; }
if(!sContainerID){ sContainerID = "nicetitlecontainer";}
if(!sClassName){ sClassName = "nicetitle";}
var oContainer = document.getElementById(sContainerID);
if(!oContainer){
oContainer = document.createElementNS ? document.createElementNS(sNameSpaceURI, "div") : document.createElement("div");
oContainer.setAttribute("id", sContainerID);
oContainer.className = sClassName;
oContainer.style.display = "none";
document.getElementsByTagName("body").item(0).appendChild(oContainer);
}
//=====================================================================
// Method addElements (Public)
//=====================================================================
this.addElements = function addElements(collNodes, sAttribute){
var currentNode, sTitle;
for(var i = 0; i < collNodes.length; i++){
currentNode = collNodes[i];
sTitle = currentNode.getAttribute(sAttribute);
if(sTitle){
currentNode.setAttribute("nicetitle", sTitle);
currentNode.removeAttribute(sAttribute);
addEvent(currentNode, 'mouseover', show);
addEvent(currentNode, 'mouseout', hide);
addEvent(currentNode, 'mousemove', reposition); //added to allow cursor tracking
//addEvent(currentNode, 'focus', show);
addEvent(currentNode, 'blur', hide);
}
}
}
//=====================================================================
// Other Methods (All Private)
//=====================================================================
function show(e){
if (supressNiceTitles == true)
{ //*************************************************
//* Hack to prevent nice titles from displaying *
//*************************************************
return;
}
if (isActive){ hide(); }
var oNode = window.event ? window.event.srcElement : e.currentTarget;
if(!oNode.getAttribute("nicetitle")){
while(oNode.parentNode){
oNode = oNode.parentNode; // immediately goes to the parent, thus we can only have element nodes
if(oNode.getAttribute("nicetitle")){ break; }
}
}
var sOutput = parseTemplate(oNode);
setContainerContent(sOutput);
var oPosition = getPosition(e, oNode);
oContainer.style.left = oPosition.x;
oContainer.style.top = oPosition.y;
//added showingAlready. cursor tracks only after delay occurs
if(nDelay){
oTimer = setTimeout(function(){oContainer.style.display = "block"; showingAlready = true;}, nDelay);
} else {
oContainer.style.display = "block";
}
isActive = true;
// Let's put this event to a halt before it starts messing things up
window.event ? window.event.cancelBubble = true : e.stopPropagation();
}
function hide(){
clearTimeout(oTimer);
oContainer.style.display = "none";
removeContainerContent();
isActive = false;
showingAlready = false;
}
//function added to allow cursor tracking
function reposition(e){
if (supressNiceTitles == true)
{ //*************************************************
//* Hack to prevent nice titles from displaying *
//*************************************************
hide();
return;
}
var oNode = window.event ? window.event.srcElement : e.currentTarget;
var oPosition = getPosition(e, oNode);
oContainer.style.left = oPosition.x;
oContainer.style.top = oPosition.y;
if(showingAlready){
oContainer.style.display = "block";}
else{
oContainer.style.display = "none";}
isActive = true;
// Let's put this event to a halt before it starts messing things up
window.event ? window.event.cancelBubble = true : e.stopPropagation();
}
function setContainerContent(sOutput){
sOutput = sOutput.replace(/&/g, "&");
if(document.createElementNS && window.DOMParser){
var oXMLDoc = (new DOMParser()).parseFromString("<root xmlns=\""+sNameSpaceURI+"\">"+sOutput+"</root>", "text/xml");
var oOutputNode = document.importNode(oXMLDoc.documentElement, true);
var oChild = oOutputNode.firstChild;
var nextChild;
while(oChild){
nextChild = oChild.nextSibling; // Once the child is appended, the nextSibling reference is gone
oContainer.appendChild(oChild);
oChild = nextChild;
}
} else {
oContainer.innerHTML = sOutput;
}
}
function removeContainerContent(){
var oChild = oContainer.firstChild;
var nextChild;
if(!oChild){ return; }
while(oChild){
nextChild = oChild.nextSibling;
try {oContainer.removeChild(oChild);} catch(err){}
oChild = nextChild;
}
}
function getPosition(e, oNode){
var oViewport = getViewport();
var oCoords;
var commonEventInterface = window.event ? window.event : e;
if(commonEventInterface.type == "focus"){
oCoords = getNodePosition(oNode);
oCoords.x += nMarginX;
oCoords.y += nMarginY;
} else {
oCoords = { x : commonEventInterface.clientX + oViewport.x + nMarginX, y : commonEventInterface.clientY + oViewport.y + nMarginY};
}
// oContainer needs to be displayed before width and height can be retrieved
if(showingAlready == false) // if statement prevents flickering in os x firefox when tracking cursor
{oContainer.style.visiblity = "hidden";
oContainer.style.display = "block";}
var containerWidth = oContainer.offsetWidth;
if (containerWidth > 230) containerWidth = 230;
var containerHeight = oContainer.offsetHeight;
if(showingAlready == false)
{oContainer.style.display = "none";
oContainer.style.visiblity = "visible";}
if(oCoords.x + containerWidth + 10 >= oViewport.width + oViewport.x)
{ oCoords.x = oCoords.x - nMarginX - containerWidth - 10;
}
if(oCoords.y + containerHeight + 10 >= oViewport.height + oViewport.y){
oCoords.y = oViewport.height + oViewport.y - containerHeight - oNode.offsetHeight - 10;
}
oCoords.x += "px";
oCoords.y += "px";
return oCoords;
}
function parseTemplate(oNode){
var sAttribute, collOptionalAttributes;
var oFound = {};
var sResult = sTemplate;
if(sResult.match(/content\(\)/)){
sResult = sResult.replace(/content\(\)/g, getContentOfNode(oNode));
}
var collSearch = sResult.split(/attr\(/);
for(var i = 1; i < collSearch.length; i++){
sAttribute = collSearch[i].split(")")[0];
oFound[sAttribute] = oNode.getAttribute(sAttribute);
if(oFound[sAttribute] && oFound[sAttribute].length > nStringMaxLength){
oFound[sAttribute] = oFound[sAttribute].substring(0, nStringMaxLength) + "...";
}
}
var collOptional = sResult.split("?")
for(var i = 1; i < collOptional.length; i += 2){
collOptionalAttributes = collOptional[i].split("attr(");
for(var j = 1; j < collOptionalAttributes.length; j++){
sAttribute = collOptionalAttributes[j].split(")")[0];
if(!oFound[sAttribute]){ sResult = sResult.replace(new RegExp("\\?[^\\?]*attr\\("+sAttribute+"\\)[^\\?]*\\?", "g"), ""); }
}
}
sResult = sResult.replace(/\?/g, "");
for(sAttribute in oFound){
sResult = sResult.replace("attr\("+sAttribute+"\)", oFound[sAttribute]);
}
sResult = sResult.replace(/<BR>/g,"</p><p class=\"titletext\">");
return sResult;
}
function getContentOfNode(oNode){
var sContent = "";
var oSearch = oNode.firstChild;
while(oSearch){
if(oSearch.nodeType == 3){
sContent += oSearch.nodeValue;
} else if(oSearch.nodeType == 1 && oSearch.hasChildNodes){
sContent += getContentOfNode(oSearch);
}
oSearch = oSearch.nextSibling
}
return sContent;
}
function getNodePosition(oNode){
var x = 0;
var y = 0;
do {
if(oNode.offsetLeft){ x += oNode.offsetLeft }
if(oNode.offsetTop){ y += oNode.offsetTop }
} while((oNode = oNode.offsetParent) && !document.all) // IE gets the offset 'right' from the start
return {x : x, y : y}
}
// Idea from 13thParallel: http://13thparallel.net/?issue=2002.06&title=viewport
function getViewport(){
var width = 0;
var height = 0;
var x = 0;
var y = 0;
if(document.documentElement && document.documentElement.clientWidth){
width = document.documentElement.clientWidth;
height = document.documentElement.clientHeight;
x = document.documentElement.scrollLeft;
y = document.documentElement.scrollTop;
} else if(document.body && document.body.clientWidth){
width = document.body.clientWidth;
height = document.body.clientHeight;
x = document.body.scrollLeft;
y = document.body.scrollTop;
}
// we don't use an else if here, since Opera 7 tends to get the height on the documentElement wrong
if(window.innerWidth){
width = window.innerWidth - 18;
height = window.innerHeight - 18;
}
if(window.pageXOffset){
x = window.pageXOffset;
y = window.pageYOffset;
} else if(window.scrollX){
x = window.scrollX;
y = window.scrollY;
}
return {width : width, height : height, x : x, y : y };
}
}
//=====================================================================
// Event Listener
// by Scott Andrew - http://scottandrew.com
// edited by Mark Wubben, <useCapture> is now set to false
//=====================================================================
function addEvent(obj, evType, fn){
if(obj.addEventListener){
obj.addEventListener(evType, fn, false);
return true;
} else if (obj.attachEvent){
var r = obj.attachEvent('on'+evType, fn);
return r;
} else {
return false;
}
}